跳到主要内容

01 - 着色与基本着色模型

着色

定义

给对象应用某种材质的过程。

着色点(shading point)

对于着色点,规定以下内容:

  • 着色点所在的面是个平面(很小)
  • 观测方向为v^\mathbf{\hat{v}}
  • 平面法线(Surface normal)为n^\mathbf{\hat{n}}
  • 光照方向l^\mathbf{\hat{l}}
  • 物体表面参数(颜色,材质反光程度shininess等等)

着色点是局部的,只考虑自己,不考虑其他物体的存在(不考虑阴影,shadingshadow是两回事)。

基本着色模型/局部光照模型

我们看到物体,实际上是人眼睛接收到了来自物体的光。

从上到下依次是高光(镜面反射),漫反射(直接)和环境光照(间接,通过别的物体接收光),实际上,还有在杯子右边的发光源。

环境光照(Ambient)

环境光照即泛光反射,只考虑来自环境的光,为了简化计算,做一个大胆假设:

漫反射(Diffuse)

漫反射是光从一定角度入射之后从入射点向四面八方反射,且每个不同方向反射的光的强度相等,而产生漫反射的原因是物体表面的粗糙,导致了这种物理现象的发生。

Lambert余弦定律

当入射光线与平面垂直的时候才能完整的接受所有光的能量,而入射角度越倾斜损失的能量越大,即光照方向与平面法线的夹角成比例:

cosθ=l^n^\nonumber \mathbf{cos\theta=\hat{l}·\hat{n}}

最后的光强就是原来的光强乘上上边的cosθ\mathbf{cos\theta}

能量衰减定律

光源与着色点间的距离也该考虑,离得越远光强越弱。

例如有个点光源,它发出的能量是一定的,在近处的球壳和在远处的球壳的总能量是相同的,但由于球壳表面积不同,离得越远其上某点获取的能量也就越小。

定义离光源距离为1的点,接收到光强为II,那么距离为rr的点接收到的光强就是I/r2I/r^2(由球的表面积 + 能量守恒求得)。

根据以上两个定律,就能模拟漫反射了:

我们通过漫反射看到的能量LdL_d由三部分组成:材质的漫反射系数kdk_d,根据能量衰减定律得到的光强I/r2I/r^2,根据Lambert余弦定律得到的光强max(0,n^l^)\mathbf{max(0,\hat{n}·\hat{l})}。第三部分取max是因为角度超过直角后,就没有物理意义了。

镜面反射/高光(Specular)

Phong反射模型

其实就是一般的镜面反射:

R^\mathbf{\hat{R}}是镜面反射方向,v^\mathbf{\hat{v}}为人眼观察方向。高光只有在观察方向和反射方向比较接近的时候出现,其他情况只能看见漫反射等光,因此镜面反射会考虑他俩的夹角α\alpha

Ls=ks(I/r2)max(0,cosα)pcosα=R^v^\begin{align} \nonumber L_s &= k_s(I/r^2)\rm{max}(0,\rm{cos}\alpha)^p \\ \nonumber \rm{cos}\alpha &= \mathbf{\hat{R}·\hat{v}} \end{align}

其中,ksk_s是镜面反射系数,II为入射光强,rr为入射光到着色点距离。指数p的意义在于加速衰减,因为离高光角度越远就越应该看不到,通常是100~200。

Blinn-Phong反射模型

为了提高运算效率,将反射方向R^\mathbf{\hat{R}}与观察方向v^\mathbf{\hat{v}}的夹角认定为半程向量h^\mathbf{\hat{h}}和法线方向n^\mathbf{\hat{n}}的夹角:

半程向量的计算很巧妙,只需将入射方向和观察方向的单位向量一加(角平分线),然后求单位向量就行。

这样,就得到了基本着色模型:

参考资料